<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>数据库问题</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="faq.obtaining.html">获取 PHP</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="faq.installation.html">安装</a></div>
 <div class="up"><a href="faq.html">FAQ</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="faq.databases" class="chapter">
  <h1>数据库问题</h1>

  
  <p class="para">本节包括 PHP 和数据库之间关系的常见问题。是的，PHP 事实上可以访问如今现有的任何数据库。</p>
  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.databases.mssql">
        听说 PHP 有可能访问 Microsoft SQL Server，怎样访问？
      </a></li><li><a href="#faq.databases.access">
        能访问 Microsoft Access 数据库吗？
      </a></li><li><a href="#faq.databases.upgraded">
        我升级到了 PHP 4，结果 MySQL 不断报告&ldquo;Warning: MySQL: Unable to save result set in ..&rdquo;，这是怎么回事？
      </a></li><li><a href="#faq.databases.mysql.deprecated">
     
      Why is the MySQL extension (ext/mysql) that I&#039;ve been using for over
      10 years discouraged from use? Is it deprecated? What do I use instead?
      How can I migrate?
     
    </a></li><li><a href="#faq.databases.mysql.php5">
        PHP 5 不再绑定 MySQL 客户端库，这对我意味着什么？我还能在 PHP 中使用 MySQL 吗？我试着使用 MySQL 结果得到&ldquo;function undefined&rdquo;错误，怎么办？
      </a></li><li><a href="#faq.databases.shared-mysql">
        在安装共享 MySQL 支持之后，只要一加载 libphp4.so，Apache就会 core dump。这个问题能解决吗？
      </a></li><li><a href="#faq.databases.mysqlresource">
        为什么我得到类似如下的错误：&ldquo;Warning: 0 is not a MySQL result index in &lt;file&gt; on line &lt;x&gt;&rdquo;或者&ldquo;Warning: Supplied argument is not a valid MySQL result resource in &lt;file&gt; on line &lt;x&gt;&rdquo;？
      </a></li></ol></div>
    <dl class="qandaentry" id="faq.databases.mssql">
      <dt><strong>
        听说 PHP 有可能访问 Microsoft SQL Server，怎样访问？
      </strong></dt>
      <dd class="answer">
        <p class="para">在 Windows 机器中，可以简单地使用内置的 ODBC 支持和正确的 ODBC 驱动程序。</p>
        <p class="para">在 Unix 机器中，可以用 Sybase-CT 驱动程序来访问 Microsoft SQL Server，因为它们的协议是（至少大部分）兼容的。Sybase 做了一个 
        <a href="http://www.php.net/extra/ctlib-linux-elf.tar.gz" class="link external">&raquo;&nbsp;Linux 系统下所需库的免费版本</a>。对于其它 Unix 操作系统，需要和 Sybase 联系来得到正确的库。同样也看看下一个问题的回答。</p>
      </dd>
    </dl>
    <dl class="qandaentry" id="faq.databases.access">
      <dt><strong>
        能访问 Microsoft Access 数据库吗？
      </strong></dt>
      <dd class="answer">
        <p class="para">可以。如果完全在 Windows 9x/Me/NT/2000 下运行，那已经有了所有所需的工具，可以用 ODBC 和 Microsoft&#039;s ODBC drivers for Microsoft Access database。</p>
        <p class="para">如果在 Unix 下运行 PHP 而想访问 Windows 中的 MS Access，那需要 Unix ODBC 驱动程序。
        <a href="http://www.openlinksw.com/" class="link external">&raquo;&nbsp;OpenLink Software</a>有一个基于 Unix 的 ODBC 驱动程序可以做这件事。</p>
        <p class="para">另外一个替代方案是用带 Windows ODBC 驱动的 SQL Server 并用它来储存数据，可以通过 Microsoft Access（用 ODBC）和 PHP（用内置驱动）来访问，或者用一个 Access 和 PHP 都识别的中间文件格式，例如 flat 文件或者 dBase 数据库。关于这一点 OpenLink Software 的 Tim Hayes 写道： 
        <blockquote class="blockquote">
          <p class="para">当可以通过 ODBC 直接从 PHP 访问数据库时——例如用 OpenLink 的驱动程序，使用其它数据库做中间媒介不是一个好主意。如果确实需要一个中间文件格式，OpenLink 已经发布了对应于 Windows NT，Linux 和其它 Unix 平台的 Virtuoso（一个虚拟数据库引擎）。请访问我们的
          <a href="http://www.openlinksw.com/" class="link external">&raquo;&nbsp;网站</a>来免费下载。</p>
        </blockquote></p>
        <p class="para">还有一个已被证实有效的选择是在 Windows 下用 MySQL 和它的 MyODBC 驱动来同步数据库。Steve Lawrence 写道：</p>
        <p class="para">
          <ul class="itemizedlist">
            <li class="listitem">
              <span class="simpara">根据 MySQL 的说明在你的平台上安装 MySQL。可以从 
              <a href="http://www.mysql.com/" class="link external">&raquo;&nbsp;http://www.mysql.com/</a>得到最新版。除了设定数据库和配置用户帐号以外不需要特殊的配置，应该在 host 字段中放一个 % 或者要用来访问 MySQL 的 Windows 机器名。记下自己的服务器名，用户名和密码。</span>
            </li>
            <li class="listitem">
              <span class="simpara">从 MySQL 网站下载 MyODBC for Windows 驱动程序。在你的 Windows 机器中安装它。可以用此程序中包括的工具来测试其操作。</span>
            </li>
            <li class="listitem">
              <span class="simpara">用控制面板中的 ODBC 管理器新建一个用户或系统 dsn，设定 dsn 名称，输入你在第一步中配置的 MySQL 数据库的主机名，用户名，密码，端口等。</span>
            </li>
            <li class="listitem">
              <span class="simpara">完整安装 Access，这样可以确保得到适当的插件 ... 至少需要 ODBC 支持和连接表管理器。</span>
            </li>
            <li class="listitem">
              <span class="simpara">新建一个 Access 数据库。在 Table 窗口点击右键并选择 Link Tables，或者在 File 菜单下选择 Get External Data -&gt; Link Tables。当文件浏览窗口打开后，选择文件类型为：ODBC。接着选择 System dsn 以及在第三步建立的 dsn 的名字。再选择要连接的表，点击 OK。现在你可以在你的 MySQL 服务器中打开表并新建／删除／编辑数据了！也可以构造查询，导入／导出表到 MySQL，构造表单和报告等。</span>
            </li>
          </ul>
        </p>
        <p class="para">提示与技巧： 
        <ul class="itemizedlist">
          <li class="listitem">
            <span class="simpara">可以在 Access 中构造表并导出到 MySQL 中，再把它们连接回来。这样可以使表的建立更快。</span>
          </li>
          <li class="listitem">
            <span class="simpara">在 Access 中建立表时，必需定义一个基本键名来取得表的写权限。确认在把表连接到 Access 之前在 MySQL 中建立了基本键名。</span>
          </li>
          <li class="listitem">
            <span class="simpara">如果在 MySQL 中修改了表，必须重新连接到 Access。打开 Tools&gt;Add-ins&gt;Linked table manager，找到你的 ODBC DSN，然后在这里选择要重新连接的表。也可以在这里移动 dsn 源，在点击 OK 之前选中 always prompt for new location。</span>
          </li>
        </ul></p>
      </dd>
    </dl>
    <dl class="qandaentry" id="faq.databases.upgraded">
      <dt><strong>
        我升级到了 PHP 4，结果 MySQL 不断报告“Warning: MySQL: Unable to save result set in ..”，这是怎么回事？
      </strong></dt>
      <dd class="answer">
        <p class="para">看上去最有可能的是，PHP 4 在编译时使用了 
        <strong class="option configure">--with-mysql</strong>
选项但没有指定 MySQL 的路径。这意味着 PHP 使用了它自己内置的 MySQL 客户端库。如果你的系统运行了使用其它版本的 MySQL 客户端库的应用程序，例如作为 Apache 模块的 PHP 3，那么在两个不同版本的客户端之间有冲突。</p>
        <p class="para">重新编译 PHP 4，并在标记中加上 MySQL 的路径“
        <a href="mysql.installation.html#mysql.configure" class="link">--with-mysql=/your/path/to/mysql</a>”通常会解决此问题。</p>
      </dd>
    </dl>

   <dl class="qandaentry" id="faq.databases.mysql.deprecated">
    <dt><strong>
     
      Why is the MySQL extension (ext/mysql) that I&#039;ve been using for over
      10 years discouraged from use? Is it deprecated? What do I use instead?
      How can I migrate?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      There are three MySQL extensions, as described under the
      <a href="mysqlinfo.api.choosing.html" class="link">Choosing a MySQL API</a> section. The old API
      should not be used, and one day it will be deprecated and eventually removed from PHP.
      It is a popular extension so this will be a slow process, but you are strongly encouraged
      to write all new code with either <a href="book.mysqli.html" class="link">mysqli</a> or
      <a href="ref.pdo-mysql.html" class="link">PDO_MySQL</a>.
     </p>
     <p class="para">
      Migration scripts are not available at this time, although the mysqli API contains both
      a procedural and OOP API, with the procedural version being similar to ext/mysql.
     </p>
     <p class="para">
      It is not possible to mix the extensions. So, for example, passing a mysqli connection to
      PDO_MySQL or ext/mysql will not work.
     </p>
    </dd>
   </dl>

    <dl class="qandaentry" id="faq.databases.mysql.php5">
      <dt><strong>
        PHP 5 不再绑定 MySQL 客户端库，这对我意味着什么？我还能在 PHP 中使用 MySQL 吗？我试着使用 MySQL 结果得到“function undefined”错误，怎么办？
      </strong></dt>
      <dd class="answer">
        <p class="para">是的。PHP 总是支持 MySQL 的，不是这种方法就是那种方法。在 PHP 5 中唯一的改变就是不再绑定客户端库本身了。部分原因是（无特定顺序）：</p>
        <ul class="itemizedlist">
          <li class="listitem">
            <p class="para">现今大多数系统已经安装了客户端库了。</p>
          </li>
          <li class="listitem">
            <p class="para">由于以上原因，保持多个版本的库文件会导致混乱。例如，如果把 mod_auth_mysql 连接到某个版本，但把 PHP 连接到了另一个版本，然后在 Apache 中同时激活了它们，会得到无数错误。此外，绑定的库文件也不总是能和服务器端的版本很好地配合。对此最明显的症状是上哪里去找 UNIX 域套接字文件 mysql.socket。</p>
          </li>
          <li class="listitem">
            <p class="para">维护有些松懈，并且已经越来越落后于发行的版本了。</p>
          </li>
          <li class="listitem">
            <p class="para">未来的库版本是基于 GPL 的，因此我们没有升级的途径了，因为我们不能将基于 GPL 的库和 BSD/Apache 风格许可证的项目绑定到一起。因此具有一个干净的 PHP 5 是最好的选择。</p>
          </li>
        </ul>
        <p class="para">事实上这并不会影响到太多人。UNIX 用户，起码是那些知道自己在做什么的人，往往会在编译 PHP 时通过 
        <strong class="option configure">--with-mysql=/usr</strong>
将其绑定到自己系统中的 libmyqlclient 库上。Windows 用户可以在 <var class="filename">php.ini</var> 中激活 
        <var class="filename">php_mysql.dll</var>扩展库。更多细节见 
        <a href="ref.mysql.html" class="link">MySQL 函数</a>中的安装指南。此外，确认 
        <var class="filename">libmysql.dll</var>在系统路径中。具体怎样做的详情，请阅读 FAQ 中的
        <a href="faq.installation.html#faq.installation.addtopath" class="link">设定 Windows 系统路径</a>。因为 
        <var class="filename">libmysql.dll</var>（以及很多其它 PHP 有关文件）存放于 PHP 目录中，可能需要将 PHP 目录加入到系统路径中。</p>
      </dd>
    </dl>
    <dl class="qandaentry" id="faq.databases.shared-mysql">
      <dt><strong>
        在安装共享 MySQL 支持之后，只要一加载 libphp4.so，Apache就会 core dump。这个问题能解决吗？
      </strong></dt>
      <dd class="answer">
        <p class="para">如果你的 MySQL 库依靠 pthreads 连接就会这样。检查是否使用了 ldd。如果有的话，下载 MySQL 源程序编译，或者从源 rpm 的 spec 文件中去掉打开 threaded client 的选项然后重新编译。以上任一建议会解决此问题。然后再加上新的 MySQL 库重新编译 PHP。</p>
      </dd>
    </dl>
    <dl class="qandaentry" id="faq.databases.mysqlresource">
      <dt><strong>
        为什么我得到类似如下的错误：“Warning: 0 is not a MySQL result index in &lt;file&gt; on line &lt;x&gt;”或者“Warning: Supplied argument is not a valid MySQL result resource in &lt;file&gt; on line &lt;x&gt;”？
      </strong></dt>
      <dd class="answer">
        <p class="para">你试图用一个值为 0 的结果资源号。0 表示你的查询由于某原因失败了，需要在提交查询之后和在使用返回结果资源号之前检查错误。正确的方法是用类似如下的代码： 
        <div class="example-contents">
          <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /><br />$result&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT&nbsp;*&nbsp;FROM&nbsp;tables_priv"</span><span style="color: #007700">);<br />if&nbsp;(!</span><span style="color: #0000BB">$result</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #0000BB">mysql_error</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;exit;<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
</div>
或者 
        <div class="example-contents">
          <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /><br />$result&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT&nbsp;*&nbsp;FROM&nbsp;tables_priv"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;die(</span><span style="color: #DD0000">"Bad&nbsp;query:&nbsp;"&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">mysql_error</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
</div>
</p>
      </dd>
    </dl>
  
</div>
<hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="faq.obtaining.html">获取 PHP</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="faq.installation.html">安装</a></div>
 <div class="up"><a href="faq.html">FAQ</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>
